package org.example.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * rdd的算子，也就是rdd的方法
 *
 *
 */
object Spark18_RDD_Operator_Join {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val context = new SparkContext(conf)


    val rdd1: RDD[(String, Int)] = context.makeRDD(List(("a",1),("b",2),("c",3)))

    val rdd2: RDD[(String, Int)] = context.makeRDD(List(("b",5),("a",4),("c",6)))

    /**
      * 可以对相同的key进行关联
      *
      * 所以输出的结果是，，
      *
      * （a,(1,4)）
      * （b,(2,5)）
      * （c,(3,6)）
      *
      * 将两个不同的数据源的数据，相同的key的value连接在一起形成元组
      *
      * 如果两个数据源中没有匹配上，那么数据就不会出现在结果集中
      *
      * 如果两个数据源中存在多个相同的key，会依次匹配，
      * 可能会出现笛卡尔积，数据量会几何性增长，性能会下降
      */

    val joinRdd: RDD[(String, (Int, Int))] = rdd1.join(rdd2)

    joinRdd.collect().foreach(println)


    context.stop()
  }
}
